package com.sisgesbyte.dao.administracion;

import java.util.List;

import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import com.sisgesbyte.dao.beanDao.FiltrosSQLBean;
import com.sisgesbyte.dao.beanDao.ProductoRequest;
import com.sisgesbyte.dao.utilDao.CreaFiltroSqlString;
import com.sisgesbyte.data.entity.administracion.ProductoEntity;
import com.sisgesbyte.data.entity.comun.GenericEntity;
import com.sisgesbyte.data.util.AbstractFacade;

@Stateless
public class MantenimientoProductoDaoImpl extends
		AbstractFacade<ProductoEntity> implements MantenimientoProductoDao {

	@Inject
	private CreaFiltroSqlString creaFiltroSqlString;

	@PersistenceContext(unitName = "SigesSiscompPU")
	private EntityManager em;

	@Override
	protected EntityManager getEntityManager() {
		return em;
	}

	public MantenimientoProductoDaoImpl() {
		super(ProductoEntity.class);
	}

	@Override
	public List<ProductoEntity> listarProductos(FiltrosSQLBean cadenaFiltros) {

		StringBuilder jpql = new StringBuilder();
		jpql.append("SELECT p.id, p.categoria_producto_id,cp.nombre categoria_producto, ");
		jpql.append("p.marca_id, m.marca,p.cod_prod, p.cod_barra, p.producto, ");
		jpql.append("p.observacion, p.unidad_medida_id,um.descripcion unidad_medida,");
		jpql.append("p.unidadesxcaja, p.peso, p.imagen, p.precio_promedio, p.imagen, p.active  ");
		jpql.append("FROM administracion.producto p ");
		jpql.append("inner join administracion.categoria_producto cp on p.categoria_producto_id=cp.id ");
		jpql.append("inner join administracion.marca m on p.marca_id=m.id ");
		jpql.append("inner join comun.unidad_medida um on p.unidad_medida_id=um.id ");

		// concatenamos el filtro
		if (cadenaFiltros != null) {
			StringBuilder filtro = new StringBuilder();
			filtro.append(creaFiltroSqlString.concatenar(cadenaFiltros));
			jpql.append(filtro.toString());
		}
		System.out.println(jpql.toString());
		Query query = em.createNativeQuery(jpql.toString(),
				ProductoEntity.class);
		if (cadenaFiltros != null && cadenaFiltros.getListaValores() != null
				&& cadenaFiltros.getListaValores().size() > 0) {
			int num = 0;
			for (Object valor : cadenaFiltros.getListaValores()) {
				System.out.println(valor);
				query.setParameter(++num, valor);
			}
		}
		List<ProductoEntity> ls = query.getResultList();

		return ls;
	}

	@Override
	public GenericEntity guardarProducto(ProductoRequest request) {
		StringBuilder jpql = new StringBuilder();
		jpql.append("select * from administracion.sp_registrar_producto(:in_categoria_producto_id , ");
		jpql.append(":in_marca_id , :in_cod_prod , :in_cod_barra , :in_producto ,  :in_observacion  ,");
		jpql.append(":in_unidad_medida_id , :in_unidadesxcaja , :in_peso , ");
		jpql.append(":in_imagen , :in_precio_promedio, :in_active)");

		Query query = em.createNativeQuery(jpql.toString(), GenericEntity.class);
		query.setParameter("in_categoria_producto_id",request.getCateoriaProdId());
		query.setParameter("in_marca_id", request.getMarcaId());
		query.setParameter("in_cod_prod", request.getCodProducto());
		query.setParameter("in_cod_barra", request.getCodBarra());
		query.setParameter("in_producto", request.getProducto());
		query.setParameter("in_observacion", request.getObservacion());
		query.setParameter("in_unidad_medida_id", request.getUnidadMedidaId());
		query.setParameter("in_unidadesxcaja", request.getUnidadesxcaja());
		query.setParameter("in_peso", request.getPeso());
		query.setParameter("in_imagen", request.getImagen());
		query.setParameter("in_precio_promedio", request.getPrecioPromedio());
		query.setParameter("in_active", request.getActive());

		return (GenericEntity) query.getSingleResult();
	}

	@Override
	public GenericEntity actualizarProducto(ProductoRequest request) {
		StringBuilder jpql = new StringBuilder();
		jpql.append("select * from administracion.sp_actualizar_producto(:in_id , :in_categoria_producto_id , ");
		jpql.append(":in_marca_id , :in_cod_prod , :in_cod_barra , :in_producto , :in_observacion , ");
		jpql.append(":in_unidad_medida_id , :in_unidadesxcaja , :in_peso , :in_precio_promedio , :in_active)");

		Query query = em.createNativeQuery(jpql.toString(), GenericEntity.class);
		query.setParameter("in_id", request.getId());
		query.setParameter("in_categoria_producto_id",request.getCateoriaProdId());
		query.setParameter("in_marca_id", request.getMarcaId());
		query.setParameter("in_cod_prod", request.getCodProducto());
		query.setParameter("in_cod_barra", request.getCodBarra());
		query.setParameter("in_producto", request.getProducto());
		query.setParameter("in_observacion", request.getObservacion());
		query.setParameter("in_unidad_medida_id", request.getUnidadMedidaId());
		query.setParameter("in_unidadesxcaja", request.getUnidadesxcaja());
		query.setParameter("in_peso", request.getPeso());
		query.setParameter("in_precio_promedio", request.getPrecioPromedio());
		query.setParameter("in_active", request.getActive());

		return (GenericEntity) query.getSingleResult();
	}

	@Override
	public GenericEntity eliminarProducto(int codProducto) {
		StringBuilder jpql = new StringBuilder();
		jpql.append("select * from administracion.sp_eliminar_producto(:in_id)");

		Query query = em.createNativeQuery(jpql.toString(), GenericEntity.class);
		query.setParameter("in_id", codProducto);

		return (GenericEntity) query.getSingleResult();
	}

	@Override
	public GenericEntity actualizarImagenProducto(ProductoRequest request) {
		StringBuilder jpql = new StringBuilder();
		jpql.append("select * from administracion.sp_actualizar_imagen_producto(:in_id , :in_imagen)");

		Query query = em.createNativeQuery(jpql.toString(), GenericEntity.class);
		query.setParameter("in_id", request.getId());
		query.setParameter("in_imagen", request.getImagen());

		return (GenericEntity) query.getSingleResult();
	}

}
